package com.example.emos.wx;

import cn.hutool.core.util.StrUtil;
import com.example.emos.wx.config.SystemConstants;
import com.example.emos.wx.db.dao.SysConfigDao;
import com.example.emos.wx.db.pojo.SysConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.web.bind.annotation.ExceptionHandler;

import javax.annotation.PostConstruct;
import java.io.File;
import java.lang.reflect.Field;
import java.util.List;

@SpringBootApplication
@ServletComponentScan
@Slf4j
@EnableAsync
public class EmosWxApiApplication {

	@Autowired
	private SysConfigDao sysConfigDao;

	@Autowired
	private SystemConstants constants;

	@Value("${emos.image-folder}")
	private String imageFolder;

	public static void main(String[] args) {
		SpringApplication.run(EmosWxApiApplication.class, args);
	}

	/**
	 * @PostConstruct该注解被用来修饰一个非静态的void（）方法。
	 * 被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行，
	 * (在方法上加该注解会在项目启动的时候执行该方法，也可以理解为在spring容器初始化的时候执行该方法)
	 * 并且只会被服务器执行一次。
	 * PostConstruct在构造函数之后执行，init（）方法之前执行。
	 */
	@PostConstruct
	public void init() {
		List<SysConfig> list = sysConfigDao.selectAllParam(); // 从数据库获取这些常量值
		list.forEach(one->{
			String key = one.getParamKey();
			key = StrUtil.toCamelCase(key); // 将下划线表示法转化为驼峰命名法
			String value = one.getParamValue();
			// 通过反射的方式进行封装
			try {
				Field field = constants.getClass().getDeclaredField(key);
				field.set(constants, value);
			} catch (Exception e) {
				log.error("执行异常", e);
			}
		});

		// 创建签到照片存地址
		new File(imageFolder).mkdir();
	}
}
